{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tạo tập dữ liệu hướng dẫn (instruction tuning)\n",
    "\n",
    "Notebook này sẽ hướng dẫn bạn qua quá trình tạo tập dữ liệu để tinh chỉnh hướng dẫn. Chúng ta sẽ sử dụng package `distilabel` để tạo tập dữ liệu cho việc tinh chỉnh hướng dẫn.\n",
    "\n",
    "Vì vậy, hãy cùng tìm hiểu sâu hơn về một số tập dữ liệu tinh chỉnh hướng dẫn.\n",
    "\n",
    " <div style='background-color: lightblue; padding: 10px; border-radius: 5px; margin-bottom: 20px; color:black'>\n",
    "     <h2 style='margin: 0;color:blue'>Bài tập: Tạo tập dữ liệu hướng dẫn</h2>\n",
    "     <p>Bây giờ bạn đã biết cách tạo tập dữ liệu để tinh chỉnh hướng dẫn, hãy thử tạo tập dữ liệu để tinh chỉnh hướng dẫn.</p>\n",
    "     <p><b>Các mức độ khó</b></p>\n",
    "     <p>🐢 Tạo tập dữ liệu tinh chỉnh hướng dẫn</p>\n",
    "     <p>🐕 Tạo tập dữ liệu để tinh chỉnh hướng dẫn với dữ liệu hạt giống (seed data)</p>\n",
    "     <p>🦁 Tạo tập dữ liệu để tinh chỉnh hướng dẫn với dữ liệu hạt giống và với sự tiến hóa hướng dẫn (instruction evolution)</p>\n",
    " </div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "vscode": {
     "languageId": "plaintext"
    }
   },
   "source": [
    "## Cài đặt thư viện\n",
    "\n",
    "Thay vì `transformers`, bạn cũng có thể cài đặt `vllm` hoặc `hf-inference-endpoints`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install \"distilabel[hf-transformers,outlines,instructor]\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Bắt đầu tạo dữ liệu\n",
    "\n",
    "Như chúng ta đã thấy trong nội dung khóa học trước, chúng ta có thể tạo các quy trình (pipeline) `distilabel` để tạo tập dữ liệu hướng dẫn. Quy trình tối thiểu đã được cung cấp. Đảm bảo mở rộng quy trình này để tạo tập dữ liệu lớn cho việc tinh chỉnh hướng dẫn. Thay đổi các mô hình và các đối số (generation arguments) để xem chúng ảnh hưởng như thế nào đến chất lượng của tập dữ liệu. Thử nghiệm nhỏ, mở rộng quy mô sau.\n",
    "\n",
    "Hãy tham khảo [thư viện các thành phần distilabel](https://distilabel.argilla.io/latest/components-gallery/) để biết thông tin về các lớp xử lý và cách sử dụng chúng.\n",
    "\n",
    "Một ví dụ về việc tải dữ liệu từ Hub thay vì ở dạng thư viện (dictionary) được cung cấp bên dưới.\n",
    "\n",
    "```python\n",
    "from datasets import load_dataset\n",
    "\n",
    "with Pipeline(...) as pipeline:\n",
    "    ...\n",
    "\n",
    "if __name__ == \"__main__:\n",
    "    dataset = load_dataset(\"my-dataset\", split=\"train\")\n",
    "    distiset = pipeline.run(dataset=dataset)\n",
    "```\n",
    "\n",
    "Đừng quên đẩy tập dữ liệu của bạn lên Hub sau khi chạy quy trình!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from distilabel.llms import TransformersLLM\n",
    "from distilabel.pipeline import Pipeline\n",
    "from distilabel.steps import LoadDataFromDicts\n",
    "from distilabel.steps.tasks import TextGeneration\n",
    "\n",
    "with Pipeline() as pipeline:\n",
    "    data = LoadDataFromDicts(data=[{\"instruction\": \"Tạo một câu hỏi ngắn về Khóa học Smol của Hugging Face.\"}])\n",
    "    llm = TransformersLLM(model=\"HuggingFaceTB/SmolLM2-1.7B-Instruct\")\n",
    "    gen_a = TextGeneration(llm=llm, output_mappings={\"generation\": \"instruction\"})\n",
    "    gen_b = TextGeneration(llm=llm, output_mappings={\"generation\": \"response\"})\n",
    "    data >> gen_a >> gen_b\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    distiset = pipeline.run(use_cache=False)\n",
    "    distiset.push_to_hub(\"huggingface-smol-course-instruction-tuning-dataset\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 🌯 Kết thúc\n",
    "\n",
    "Bây giờ bạn đã biết cách tạo tập dữ liệu để tinh chỉnh hướng dẫn. Bạn có thể sử dụng điều này để:\n",
    "\n",
    " - Tạo tập dữ liệu để tinh chỉnh hướng dẫn.\n",
    " - Tạo tập dữ liệu đánh giá để tinh chỉnh hướng dẫn.\n",
    "\n",
    "Tiếp theo\n",
    "\n",
    "🧑‍🏫 Tìm hiểu - Về [tạo tập dữ liệu ưu tiên](./preference_datasets.md)\n",
    "\n",
    "🏋️‍♂️ Tinh chỉnh một mô hình để tinh chỉnh hướng dẫn với tập dữ liệu giả lập dựa trên [chương tinh chỉnh hướng dẫn](../../1_instruction_tuning/README.md)"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
